package com.gitee.deament.server.core.cli.db.hash;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.List;
import java.util.Map;

/**
 * HDEL
 * HDEL key field [field …]
 * <p>
 * 删除哈希表 key 中的一个或多个指定域，不存在的域将被忽略。
 * <p>
 * Note
 * <p>
 * 在Redis2.4以下的版本里， HDEL 每次只能删除单个域，如果你需要在一个原子时间内删除多个域，请将命令包含在 MULTI / EXEC 块内。
 * <p>
 * 可用版本：
 * >= 2.0.0
 * <p>
 * 时间复杂度:
 * O(N)， N 为要删除的域的数量。
 * <p>
 * 返回值:
 * 被成功移除的域的数量，不包括被忽略的域。
 *
 * @author deament
 */
@CliHander(command = "HDEL")
public class HDELcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {

        List<String> values = getValues(command);
        if (values.size() < 3) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'HDEL' command"));
        }
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        Value<Map<String, String>> hashData = SystemConfig.dbData.getHashData(db, values.get(0));
        StringBuilder msg = new StringBuilder();
        for (int i = 2; i < values.size(); i++) {
            String result = hashData.getValue().remove(values.get(i));
            if (result == null) {
                msg.append("0\r\n");
            } else {
                msg.append("1\r\n");
            }
        }
        channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(msg.toString()));

    }
}
